package chapter06

/**
  * create by undeRdoG on  2021-05-31  22:40
  * 凡心所向，素履以往，生如逆旅，一苇以航。
  */
object Test06_ConstructorParams {


  /*
     Scala 类的主构造器函数的形参包括三种类型：未用任何修饰、var 修饰、val 修饰
    （1）未用任何修饰符修饰，这个参数就是一个局部变量
    （2）var 修饰参数，作为类的成员属性使用，可以修改
    （3）val 修饰参数，作为类只读属性使用，不能修改
    */
  def main(args: Array[String]): Unit = {
    val student3 = new Student3("BOB", 20)
    println(student3.age + student3.name)

    val student4 = new Student4("bob", 20)

    /**
      * 这样的调用是不允许的，没有使用var 申明，并不是当前类中的属性，只是单纯的形参而已，因此只能通过方法来访问
      **/
    //println(student4.age + student4.name)
    student4.printInfo()

    val student5 = new Student5("bob",20)
    // student5.age = 21    error


    val  student6 = new Student6("Jerry",15,"peking")
    println(s"name: ${student6.name} age:${student6.age} school: ${student6.school}")

  }

}


// 定义类
// 无参构造器
class Student2 {
  var name: String = _
  var age: Int = _
}

// 主构造器参数由 var 修饰
/**
  * 这样定义，相当于声明了  name  和 age  就是 当前类中的属性
  *
  * 推荐写法
  **/
class Student3(var name: String, var age: Int)

// 主构造器参数无修饰
class Student4(name: String, age: Int) {

  def printInfo() = {
    println(s"name ${name} age: ${age}")
  }


}


/**
  *  用 val 修饰后，无法修改，即初始化时定义的属性值就无法再更改
  * */
class Student5(val name:String, val age:Int)


class Student6(var name: String, var age: Int){

  var school: String = _
  def this(name: String,age :Int, school: String){
    this(name,age)
    this.school = school
  }
}